﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Wpfконфигуратор.Визуализаторы;
using конфигуратор;

namespace Wpfконфигуратор
{
    /// <summary>
    /// Логика взаимодействия для Редактор.xaml
    /// </summary>
    public partial class Редактор : UserControl
    {
        public ДинамикОбъект ДинОбъект
        {
            get { return DataContext as ДинамикОбъект; }
            set
            {
                DataContext = value;
                     История.ДобавитьПервый( value );
            }
        }

        public ИсторияПросмотра История = new ИсторияПросмотра();

        public Редактор ()
        {
            InitializeComponent();
        }

        private void кнопкаНазад_Click ( object sender, RoutedEventArgs e )
        {
            var дин = ( ДинамикОбъект ) История.Назад();
            if ( дин != ДинОбъект )
            {
                DataContext = дин;
                дин.Обновить( "все" );
            }
        }

        private void кнопкаВперед_Click ( object sender, RoutedEventArgs e )
        {
            var дин = ( ДинамикОбъект ) История.Вперед();
            if ( дин != ДинОбъект )
            {
                DataContext = дин;
                дин.Обновить( "все" );
            }

        }

        private void СписокПолей_MouseDoubleClick ( object sender, MouseButtonEventArgs e )
        {

            var поле =(ПолеВизуализатор) (( ListBox ) sender).SelectedItem;
            var значение = поле.Значение;
            ДинамикОбъект дин;
            if ( значение == null )
            {
                    var тип = поле.F.FieldType;
                    if ( тип.IsPrimitive || тип == typeof( string ) ) return;
                    дин = new ДинамикОбъект( тип );
            }
            else
            {
                var ttt = значение.GetType();
                if ( ttt.IsPrimitive || ttt == typeof( string ) ) return;
                дин = new ДинамикОбъект( значение );
            }

            DataContext = дин;

            История.ВставитьВТекущуюПозицию( дин );

        }
        private void СписокСвойств_MouseDoubleClick ( object sender, MouseButtonEventArgs e )
        {

            var свойство = ( СвойствоОболочка ) (( ListBox ) sender).SelectedItem;
            var значение = свойство.Значение;
            ДинамикОбъект дин;
            if ( значение == null )
            {
                var тип = свойство.СвойствоИнфо.PropertyType;
                if ( тип.IsPrimitive || тип == typeof( string ) ) return;
                дин = new ДинамикОбъект( тип );
            }
            else
            {
                var ttt = значение.GetType();
                if ( ttt.IsPrimitive || ttt == typeof( string ) ) return;
                дин = new ДинамикОбъект( значение );
            }

            DataContext = дин;

            История.ВставитьВТекущуюПозицию( дин );

        }

      

       

        private void dataGrid1_SelectionChanged ( object sender, SelectionChangedEventArgs e )
        {
            var so = e.AddedItems;
        }

        private void dataGrid1_SelectedCellsChanged ( object sender, SelectedCellsChangedEventArgs e )
        {
            //if ( e.AddedCells.Count == 0 ) return;
            //dataGrid1.BeginEdit();
        }

        private void dataGrid1_MouseDoubleClick ( object sender, MouseButtonEventArgs e )
        {
            //var поле = (( DataGrid ) sender).SelectedItem;
            // var вид = ( ListCollectionView ) 
            //  ((CollectionViewSource) tabItemПоля.FindResource( "КоллекцияПоля" )).View;    
            //try
            //{
            //    вид.CancelEdit();   
            //}
            //catch {   }

            if((( DataGrid ) sender).SelectedCells.Count!=0 )
            {
                var поле =(ПолеВизуализатор) (( DataGrid ) sender).SelectedCells[0].Item;
                var значение =  поле.Значение;
                if ( значение == null ) return;
                var ttt = значение.GetType();
                if ( ttt.IsPrimitive || ttt == typeof( string ) ) return;
                var дин = new ДинамикОбъект( значение );
                DataContext = дин;
                История.ВставитьВТекущуюПозицию( дин );

            }
            e.Handled = true;

        }
        private void DataGrid_LoadingRow ( object sender, DataGridRowEventArgs e )
        {
            //var вид = ( ListCollectionView ) CollectionViewSource.GetDefaultView( dataGrid1.ItemsSource );

            //var dataGrid1 = ((DataGrid) ПредсталениеПолей.Content);
            //var item = dataGrid1.ItemContainerGenerator.ItemFromContainer( e.Row );

            //var n = (( IList ) dataGrid1.ItemsSource).IndexOf( item );
            //e.Row.Header = n;

            //(e.Row.GetIndex()).ToString();
        }
        private void DataGrid_LoadingRowЭлементы ( object sender, DataGridRowEventArgs e )
        {
            e.Row.Header = (e.Row.GetIndex()).ToString();
        }

        private void dataGridЭлементы_CellEditEnding ( object sender, DataGridCellEditEndingEventArgs e )
        {
            //var t = e.Row.Item.GetType();
            //var z=  Парсер.Преобразовать(((TextBox) e.EditingElement).Text,t);
            //if ( z != null )
            //    ((IList) dataGridЭлементы.ItemsSource)[e.Row.GetIndex()] = z;
            //    //e.Row.Item = z;
            //dataGrid1.CommitEdit();
        }

        private void dataGridЭлементы_MouseDoubleClick ( object sender, MouseButtonEventArgs e )
        {
            var вид = ( ListCollectionView ) CollectionViewSource.GetDefaultView( dataGridЭлементы.ItemsSource );
            if (вид.IsEditingItem)
            {
                try
                {
                        вид.CancelEdit();
                }
                catch
                {        }
            }
            if (вид.IsAddingNew) {вид.CancelNew(); return;}

            var элемент = (ЭлементМассива) (( DataGrid ) sender).SelectedCells[0].Item;
            var значение = элемент.Значение;
            if ( значение == null ) return;
            var ttt = значение.GetType();
            if ( ttt.IsPrimitive || ttt == typeof( string ) ) return;
            var дин = new ДинамикОбъект( значение );
            DataContext = дин;
            История.ВставитьВТекущуюПозицию( дин );
        }

        private void dataGridЭлементы_CellEditEnding_1 ( object sender, DataGridCellEditEndingEventArgs e )
        {
            //if ( e.EditAction == DataGridEditAction.Cancel ) return;
            //var el = e.Row.Item as ЭлементМассива;
            //var index = e.Row.GetIndex();
            //var список = (( IList ) ДинОбъект.Элементы);
          

        }

        private void dataGridЭлементы_InitializingNewItem ( object sender, InitializingNewItemEventArgs e )
        {
            var el = (ЭлементМассива) e.NewItem;
             var реальныйСписок = (IList) ДинОбъект.Объект;
            el._динОбъект = ДинОбъект;

            el.индекс = реальныйСписок.Count;

            var новыйЭлемент = ДинОбъект.ТипЭлемента==typeof(string)?"": Activator.CreateInstance(ДинОбъект.ТипЭлемента);

            реальныйСписок.Add(новыйЭлемент);


        }

        private void CollectionViewSource_Filter ( object sender, FilterEventArgs e )
        {

            var метод = (Метод) e.Item;
            if (ФильтрСвойств.IsChecked)
            {
                if ( метод.МетодИнфо.Name.Contains( "get_" ) || метод.МетодИнфо.Name.Contains( "set_" ) )
                {
                    e.Accepted = false;
                    return;
                }
            }

            if (ФильтрСобытий.IsChecked)
            {
                if ( метод.МетодИнфо.Name.Contains( "add_" ) || метод.МетодИнфо.Name.Contains( "remove_" ) )
                {
                    e.Accepted = false;
                    return;
                }
            }
            if (ФильтрВидимые.IsChecked && метод.Видимый==false)
            {
                    e.Accepted = false;
                    return;
            }
                
          
        }

        private void ОбновитьПредставлениеМетодов ( object sender, RoutedEventArgs e )
        {
            var представление = CollectionViewSource.GetDefaultView( listBoxКомандыОбъекта.ItemsSource );
            if (представление!=null)    представление.Refresh();
            
        }

        private void CollectionViewSource_FilterПоля ( object sender, FilterEventArgs e )
        {
            var поле = (ПолеВизуализатор) e.Item;

            e.Accepted = false;
            var атрибут = поле.АтрибутыДоступа;
            if ( publicПоля.IsChecked && атрибут == "public" ) e.Accepted = true;
            if ( protectedПоля.IsChecked && атрибут == "protected" ) e.Accepted = true;
            if ( protinterПоля.IsChecked && атрибут == "protected internal" ) e.Accepted = true;
            if ( internalПоля.IsChecked && атрибут == "internal" ) e.Accepted = true;
            if ( privateПоля.IsChecked && атрибут == "private" ) e.Accepted = true;
            if ( e.Accepted == false )
            {
                return;
            }

        }

        private void ОбновитьПредставлениеПолей  ( object sender, RoutedEventArgs e )
        {
           
            var представление =  tabItemПоля.FindResource("КоллекцияПоля") ;
            if ( представление != null ) ((CollectionViewSource) представление).View.Refresh();

        }

     
        private void МенюВид_Click ( object sender, RoutedEventArgs e )
        {
            var меню=  e.Source as MenuItem;
            if (меню != null)
            {
                var значение = меню.Header.ToString();
                if ( значение == "Таблица" )
                {
                    var el =(Selector) tabItemПоля.FindResource( "Таблица" );
                    el.SelectedItem = ((Selector) ПредсталениеПолей.Content).SelectedItem;
                    
                    ПредсталениеПолей.Content = el;
                }

                else
                {
                    var el = (Selector) tabItemПоля.FindResource("ПредсталениеСписок");
                     el.SelectedItem = ((Selector) ПредсталениеПолей.Content).SelectedItem;
                   
                    
                    ПредсталениеПолей.Content = el;    
                }
            }
        }


        private void CollectionViewSource_FilterСвойства(object sender, FilterEventArgs e)
        {

            var свойство = ( СвойствоОболочка ) e.Item;
            e.Accepted = false;
            var атрибут = свойство.АтрибутыДоступа;
            if ( publicСвойства.IsChecked && атрибут== "public" ) e.Accepted = true;
            if ( protectedСвойства.IsChecked && атрибут == "protected" ) e.Accepted = true;
            if ( protinterСвойства.IsChecked && атрибут == "protected internal" ) e.Accepted = true;
            if ( internalСвойства.IsChecked && атрибут == "internal" ) e.Accepted = true;
            if ( privateСвойства.IsChecked && атрибут == "private" ) e.Accepted = true;
            if ( e.Accepted == false )
            {
                return;
            }

            if ( !ФильтрВидимыеСвойства.IsChecked && !свойство.Видимый ) e.Accepted = false;
          
        }

        private void ОбновитьПредставлениеСвойств(object sender, RoutedEventArgs e)
        {
            var представление = tabItemСвойства.FindResource( "КоллекцияСвойств" );
            if ( представление != null ) (( CollectionViewSource ) представление).View.Refresh();
        }
    }
}
